package com.ys.service.sys;

import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.springframework.ui.Model;

import com.bo.dto.NameValueSelectDto;
import com.ys.dto.RowClickGridConfigDto;
import com.ys.vo.R;

import lombok.AllArgsConstructor;
import lombok.Data;

public interface CommonService {
	
	String indexCommonOfMenu(Model model,
    		HttpServletRequest request,
    		Long menuId,
    		Map<String, String> initCondCodeValue);
	@Data
	@AllArgsConstructor
	public class GridDto {
		private Long menuId;
		private String primaryKey; // 主键
		private MenuDto menu;
		private String colGrids; // 字段数组字符串
		private ToolbarDto toolbar; // 工具栏
		private List<ConditionDto> conditions; // 搜索条件
		private String templateType; // 模板类型，见ENUM
		private RowClickGridConfigDto rowClickGridConfigDto; // 行单击列表配置
		private String clickGridCols;// 行单击列表配置

		@Data
		@AllArgsConstructor
		public static class MenuDto {
			private String title; // 标题
			private String pathGridRequest; // 表格数据请求地址
			private String pathGridEditRequest; // 表格数据编辑请求地址
			private String pathGridExportRequest; // 表格数据导出请求地址
		}

		@Data
		@AllArgsConstructor
		public static class ColGridDto {
			private String title; // 字段名称
			private String field; // 字段编码
			private String type; // 类型
			private String totalRowText; // 合计行文本
			private boolean totalRow; // 是否合计行
			private String fixed; // 冻结方式
			private boolean unresize; // 是否可调整大小
			private String width; // 宽度
			private String align; // 对齐方式
			private boolean sort; // 是否排序
			private String templet; // 自定义的模板
			
			@Override
			public String toString() {
				StringBuffer sb = new StringBuffer("{");
				if (title != null && title.length() > 0) {
					sb.append("title:'" + title + "'");
				} else {
					sb.append("title:''");
				}
				if (field != null && field.length() > 0) {
					sb.append(",field:'" + field + "'");
				}
				if (type != null && type.length() > 0) {
					sb.append(",type:'" + type + "'");
				}
				if (fixed != null && fixed.length() > 0) {
					sb.append(",fixed:'" + fixed + "'");
				}
				if (unresize == true) {
					sb.append(",unresize:true");
				}
				if (totalRowText != null && totalRowText.length() > 0) {
					sb.append(",totalRowText:'" + totalRowText + "'");
				}
				if (totalRow == true) {
					sb.append(",totalRow:true");
				}
				if (width != null && width.length() > 0) {
					sb.append(",width:'" + width + "'");
				}
				if (align != null && align.length() > 0) {
					sb.append(",align:'" + align + "'");
				}
				if (sort == true) {
					sb.append(",sort:true");
				}
				if (templet != null && templet.length() > 0) {
					if (templet.startsWith("function")) {
						sb.append(",templet:" + templet);
					} else {
						sb.append(",templet:'" + templet + "'");
					}
				}
				sb.append("}");
				return sb.toString();
			}
		}

		@Data
		@AllArgsConstructor
		public static class ToolbarDto {
			private List<ButtonDto> buttonArr; // 按钮数组

			@Data
			@AllArgsConstructor
			public static class ButtonDto {
				private Integer type; // 类型
				private String name; // 名称
				private String event; // 事件
				private String icon; // 图标
				private String style; // 样式类名，如：ys-grid-btn-add
			}
		}

		@Data
		@AllArgsConstructor
		public static class ConditionDto {
			private Long id;
			private String code; // 字段编码
			private String type; // 类型，如文本、日期
			private String rangeType; // 条件类型，如：等于、不等于、大于、区间
			private String name; // 字段名称
			private String value; // 值
			private String placeHolder; // 备注
			private List<NameValueSelectDto> optionArr;
		}

		@Data
		@AllArgsConstructor
		public static class ButtonDto {
			private String htmls;
			private String scripts;
		}

		@Data
		@AllArgsConstructor
		public static class ColEditDto {
			private String elementScriptsOfText; // 编辑脚本的拼接，文本框类型
			private String elementScriptsOfNoText; // 编辑脚本的拼接，非文本框类型
			private List<ElementDto> elementArr; // 元素数组

			@Data
			@AllArgsConstructor
			public static class ElementDto {
				private String elementId; // 元素id
				private String elementHtml; // 元素html
			}
		}
	}
	
	String indexCommonOfMenuBS(Model model,
    		HttpServletRequest request,
    		Long menuId,
    		Map<String, String> initCondCodeValue);
	@Data
	@AllArgsConstructor
	public class IndexCommonOfMenuBSDto {
		private Long menuId;
		private String pathGridRequest; // 
		private List<ConditionDto> conditionArr; // 搜索条件
		private List<ButtonDto> buttonArr; // 按钮数组
		private List<ColDto> colArr; // 字段数组

		@Data
		@AllArgsConstructor
		public static class ConditionDto {
			private Long id;
			private String code; // 字段编码
			private String type; // 类型，如文本、日期
			private String rangeType; // 条件类型，如：等于、不等于、大于、区间
			private String name; // 字段名称
			private String value; // 值
			private String dictKeyBase; // 下拉框键
		}

		@Data
		@AllArgsConstructor
		public static class ButtonDto {
			private Integer type; // 类型
			private String name; // 名称
			private String event; // 事件
			private String icon; // 图标
			private String style; // 样式类名，如：ys-grid-btn-add
			private List<ItemDto> itemArr;

			@Data
			@AllArgsConstructor
			public static class ItemDto {
				private String name; // 名称
				private String event; // 事件
				private String icon; // 图标
			}
		}
		
		@Data
		@AllArgsConstructor
		public static class ColDto {
			private Long id;
			private Integer frontShow; // 前台是否显示
			private boolean stateEdit; // 是否可编辑
			private String title; // 字段名称
			private String field; // 字段编码
			private String type; // 类型
			private String fixed; // 冻结方式
			private Integer width; // 宽度
			private String align; // 对齐方式
			private boolean sort; // 是否排序
			private String dictKeyBase; // 字典KEY
			private String templet; // 自定义的模板
		}
	}
	
//	String toModalSelector(Model model,
//    		HttpServletRequest request,
//    		Long colId,
//    		Integer type);
	
	R editOnTable(HttpServletRequest request);
}
